//
//  StatusListViewModel.swift
//  MQLWeibo
//
//  Created by MQL-IT on 2016/11/14.
//  Copyright © 2016年 MQL-IT. All rights reserved.
//

import Foundation
/// 微博数据列表视图模型
/*
 父类的选择
 
 - 如果类要使用KVC或者字典转模型框架设置对象值,类就需要继承自NSObject
 - 如果类只是包装一些代码逻辑,可以不用任何父类,更加轻量级
 - 如果用OC写,一律继承自NSObject
 */

//使命: 处理微博数据
//1. 字典转模型
//2. 上拉下拉处理

fileprivate let maxPullupTimes = 3
class StatusListViewModel {
    /// 微博视图模型数组懒加载
    lazy var statusList = [StatusViewModel]()
    
    private var pullupErrorTimes = 0
    
    /// 加载微博列表
    /// - Parameter pullup: 是否是上拉刷新
    /// - Parameter completion: 完成回调  网络请求是否成功,是否需要刷新表格
    func loadStatus(pullup: Bool, completion: @escaping (_ isSuccess: Bool, _ shouldRefresh: Bool) -> ()) {
        //判断是否是上拉刷新,同时检查刷新错误
        if pullup && pullupErrorTimes > maxPullupTimes {
            completion(false, false)
            return
        }
        
        // since_id 取出数组中第一条微博的id
        let since_id = pullup ? 0 : (statusList.first?.status.id ?? 0)
        
        //上拉刷新,取出数组中最后一条微博的id
        let max_id = pullup ? (statusList.last?.status.id ?? 0) : 0
        NetWorkManager.shared.statusList(since_id: since_id, max_id: max_id) { (list, isSuccess) in
            
            //0. 判断网络请求是否成功
            if !isSuccess {
                //没有成功直接返回
                completion(false, false)
                return
            }
            
            //1.数据转模型(所有第三方框架都支持嵌套的字典转模型)
            //1>定义可变数组
            var array = [StatusViewModel]()
            //2>遍历服务器返回的字典数组, 字典转模型
            for dict in list ?? [] {
                //a>创建微博模型, 如果创建模型失败,继续下一个
                guard let model = WBStatus.yy_model(withJSON: dict) else {
                    continue
                }
                //b> 将model添加到数组
                array.append(StatusViewModel(model: model))
            }
            
            printLog(message: "刷新到\(array.count)条数据\(array)")
            //2. FIXME: 拼接数据
            //下拉刷新应该将结果数组拼接在数组前面
            if pullup {
                self.statusList += array
            } else {
                self.statusList = array + self.statusList
            }
            
            //判断上拉刷新的数据量
            if pullup && array.count == 0 {
                self.pullupErrorTimes += 1
                completion(isSuccess,false)
            } else {
                
                //3.完成回调
                completion(isSuccess,true)
                
            }
        }
    }
}
